home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio / Ham Radio CD-ROM (Emerald Software) (1995).ISO / misc / utilitys / fft.bas (.txt) < prev    next >
Encoding:
GW-BASIC  |  1980-01-01  |  2.1 KB  |  109 lines

  1. 1  PRINT;"fast fourier transform - k2uyh - ibm pc --- wa2tif":PRINT
  2. 2  DIM X1(256),X2(256)
  3. 4  N=256 : L=8 : P1=3.14159
  4. 6  REM -- GENERATE TIME FUNCTION --
  5. 10  REM MODULATED PULSE (1000 HZ)
  6. 20  FOR Z=0 TO N/4
  7. 30  X1(Z)=SIN(6283.18*T)
  8. 40  T=T+0.000195312
  9. 50  NEXT Z
  10. 60  FOR Z=N/4 TO N
  11. 70  X1(Z)=0
  12. 80  NEXT Z
  13. 500  PRINT "DO YOU WANT LISTING OF GENERATED FUNC.";
  14. 510  INPUT A$
  15. 520  IF A$ = "NO" THEN 640
  16. 530  IF A$ <> "YES" THEN 500
  17. 540  B=X1(0)
  18. 550  FOR Z=0 TO N-1
  19. 560  IF ABS(X1(Z))>B THEN B=ABS(X1(Z))
  20. 580  NEXT Z
  21. 600  FOR Z=0 TO N-1
  22. 610  PRINT X1(Z);TAB(41+20*X1(Z)/B);"*"
  23. 620  NEXT Z
  24. 630  REM SCALE INPUT TIME FUNC.
  25. 640  FOR Z=0 TO N-1
  26. 650  X1=X1(Z)/N
  27. 660  NEXT Z
  28. 670  REM FFT IN-PLACE ALGORITHM
  29. 675  PRINT "FFT CALC. IN PROGRESS"
  30. 680  I1=N/2 : I2=1 : V=2*P1/N
  31. 690  FOR I=1 TO L
  32. 700  I3=0 : I4=I1
  33. 710  FOR K=1 TO I2
  34. 720  X=INT(I3/I1)
  35. 730  GOSUB 1300
  36. 740  I5=Y
  37. 750  Z1=COS(V*I5)
  38. 760  Z2=-SIN(V*I5)
  39. 770  FOR M=I3 TO I4-1
  40. 780  A1=X1(M) : A2=X2(M)
  41. 790  B1=Z1*X1(M+I1)-Z2*X2(M+I1)
  42. 800  B2=Z2*X1(M+I1)+Z1*X2(M+I1)
  43. 810  X1(M)=A1+B1 : X2(M)=A2+B2
  44. 820  X1(M+I1)=A1-B1 : X2(M+I1)=A2-B2
  45. 830  NEXT M
  46. 840  I3=I3+2*I1 : I4=I4+2*I1
  47. 850  NEXT K
  48. 860  I1=I1/2 : I2=2*I2
  49. 870  NEXT I
  50. 880  REM - OUTPUT RESULTS -
  51. 890  PRINT "IN WHAT FORM DO YOU WANT THE OUTPUT ?"
  52. 900  PRINT "    MAGNITUDE SPECTRUM PLOT    (1)"
  53. 910  PRINT "    TABLE OF VALUES            (2)"
  54. 920  INPUT A
  55. 930  IF A=1 THEN 970
  56. 940  IF A=2 THEN 1130
  57. 950  PRINT "INCORRECT INPUT (1 OR 2)" : GOTO 890
  58. 960  REM - OUTPUT MAGNITUDE SPECTRUM PLOT
  59. 970  B=0
  60. 975  PRINT " - CALCULATIONS IN PROGRESS -"
  61. 980  FOR Z=0 TO N/2
  62. 985  X=Z
  63. 990  GOSUB 1390
  64. 1000  IF X3>B THEN B=X3
  65. 1010  NEXT Z
  66. 1020  FOR Z=0 TO N/2
  67. 1025  X=Z
  68. 1030  GOSUB 1390
  69. 1040  X4=INT(56*X3/B)
  70. 1050  C=0
  71. 1060  PRINT Z;TAB(5);"!";
  72. 1070  C=C+1
  73. 1080  IF C<X4 THEN PRINT "="; : GOTO 1070
  74. 1090  PRINT " "
  75. 1100  NEXT Z
  76. 1110  GOTO 1240
  77. 1120  REM - OUTPUT TABLE OF VALUES -
  78. 1130  U=0
  79. 1140  Z=0
  80. 1150  PRINT "HARMONIC";TAB(14);"REAL";TAB(30);
  81. 1160  PRINT "IMAGINARY";TAB(50);"MAGNITUDE"
  82. 1165  X=U
  83. 1170  GOSUB 1390
  84. 1180  PRINT U;TAB(10);X1(Y);TAB(30);X2(Y);TAB(50);X3
  85. 1190  U=U+1 : Z=Z+1
  86. 1200  IF Z>9 THEN 1140
  87. 1210  IFU>N/2 THEN 1240
  88. 1220  GOTO 1165
  89. 1230  REM - TERMINATE ? -
  90. 1240  PRINT "DO YOU WANT ANOTHER OUTPUT (YES, NO)";
  91. 1250  INPUT A$
  92. 1260  IF A$="YES" THEN 890
  93. 1270  IF A$<>"NO" THEN 1240
  94. 1280  END
  95. 1290  REM - SCRAMBLE SUBROUTINE -
  96. 1300  Y=0 : N1=N
  97. 1310  FOR W=1 TO L
  98. 1320  N1=N1/2
  99. 1330  IF X<N1 THEN 1360
  100. 1340  Y=Y+2^(W-1)
  101. 1350  X=X-N1
  102. 1360  NEXT W
  103. 1370  RETURN
  104. 1380  REM - MAGNITUDE (X3) SUBROUTINE -
  105. 1390  GOSUB 1300
  106. 1400  X3=SQR(X1(Y)^2 + X2(Y)^2)
  107. 1410  RETURN
  108. 1420  END
  109.